<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
<!-- 先引入react,再引入react-dom,因为react是核心库，react-dom是扩展库 -->
<!-- 引入以后全局多了一个REACT和ReactDOM对象 -->
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 用于将jsx转为js -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<!-- 准备好一个容器 -->
<div id="example"></div>
<div id="example1"></div>
<div id="example2"></div>
<!-- 此处一定要写babel，不写就是默认js -->
<script type="text/babel">
// 随着你的输入维护状态就是受控组件
/* 
  高阶函数：如果一个函数符合下面的2个规范中的一个，那该函数就是高阶函数
     1.若A函数，接收的参数是一个函数，那么可以称为高阶函数
     2.若A函数，调用的返回值是一个函数，那么可以称为高阶函数
     常见的高阶函数：Promise,setTimeout,arr.map()
  函数的柯里化，通过函数调用继续返回函数的方式，实现多次接收参数最后统一处理的函数编码形式


*/
class Life extends React.Component {

  state = {opacity:1}

  death = () => {
    clearInterval(this.timer)
    // 卸载组件
    ReactDom.unmountComponentAtNode(document.getElementById('example'))
  }
  // 组件挂载页面之后调用
  componentDidMount(){
    // 因为componentDidMount是react通过实例帮我们调用的this就是指向实例
    this.timer = setInterval(() => {
      let {opacity} = this.state
      opacity -= 0.1
      if(opacity <=0) opacity =1
      this.setState({opacity})
    }, 200)
  }

  // 组件将要卸载
  componentWillUnmount(){

  }



  // 这样写的问题，render第一次挂载的时候会调用，以后修改了状态，render也会再次调用 
  // render调用的时机，初始化渲染，状态更新之后
  render(){
    // setInterval(() => {
    //   let {opacity} = this.state
    //   opacity -= 0.1
    //   if(opacity <=0) opacity =1
    //   this.setState({opacity})
    // }, 200)
    return (
      <div>
        <h2 style={{opacity:this.state.opacity}}>React学不会怎么办</h2>
        <button onClick={this.death}>不活了</button>
      </div>
    )
  }
}



ReactDOM.render(
	<Life/>,
	document.getElementById('example')
);

</script>

</body>
</html>